package com.jz.dsq.condition;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.jz.dsq.ConditionBuilder;
import com.jz.dsq.utils.DsqUtil;
import com.jz.dsq.utils.Operator;


import java.util.Map;

/**
 * @author zhangliang
 * @date 2021/3/7 22:54
 */
public class MapCondition<T> extends ConditionBuilder<T> {

    /**
     * 构建查询条件方式，使用map进行条件的转换。
     * 适用于通用分页的高级查询，可以通过前台直接传入sql操作类型进行查询
     * map中key = field_oper
     * field_oper : tableColumnName_SqlOperator 字段名_sql操作
     * 对于未传查询连接符，进行默认处理
     * String -> like
     * Date  -> between
     * Boolean -> eq
     * 其他类型 -> eq
     *
     * @param map
     */
    public MapCondition(Class<T> t, Map<String, Object> map) {
        if (MapUtil.isNotEmpty(map)) {
            map.forEach((key, value) -> {
                Condition cnd = new Condition();
                // 字段名_sql操作
                String[] keys = key.split(StrUtil.UNDERLINE);
                String field = keys[0];
                // 传入sql操作
                String oper = keys.length > 1 ? keys[1] : null;
                cnd.setOperator(Operator.getEnumType(oper));
                cnd.setValue(value);
                if (ObjectUtil.isNotEmpty(value) && oper == null) {
                    DsqUtil.validateFieldKey(field, t);
                    String[] fields = StrUtil.splitToArray(field, StrUtil.C_DOT);
                    Class<?> fieldClass = ReflectUtil.getField(t, fields[0]).getType();
                    //1.单表查询场景
                    if (fields.length == 1) {
                        cnd.setKey(field);
                        DsqUtil.dynamicallyGenerateQueryConditions(cnd, fieldClass);
                    }
                    // 2.多表联查场景  table.field
                    if (fields.length > 1) {
                        Class<?> fieldClassMultiTable = ReflectUtil.getField(fieldClass, fields[1]).getType();
                        cnd.setKey(fields[1]);
                        DsqUtil.dynamicallyGenerateQueryConditions(cnd, fieldClassMultiTable);
                    }
                    cnd.setKey(key);
                    conditions.add(cnd);
                }
            });
        }
    }
}
